/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package transferencia;

import java.util.List;

/**
 * A classe Cadeia é uma subclasse da classe Tree e tem métodos específicos para
 * representação e manuseio de uma cadeia de disciplinas que se relacionam como 
 * pré-requisitos. Uma Cadeia utiliza objetos String como identificadores dos 
 * nós, que correspondem à sigla de uma Disciplina.
 * 
 * @author lljotall
 */
public class CadeiaTO extends TreeTO<String>{
    
    /*--------------------  MANIPULAÇÃO POR DISCIPLINAS  ---------------------*/
    /**
     * Cria uma árvore a partir de uma disciplina.
     * @param raiz Disciplina que será a raiz da cadeia em questão.
     */
    public CadeiaTO(DisciplinaTO raiz){
        super(raiz.getSigla());
    }
    
    /**
     * Adiciona uma disciplina e seus pré-requisitos à Cadeia.
     * @param d Disciplina a ser adicionada.
     */
    public void adicionaDisciplina(DisciplinaTO d){
        List<String> preReqs = d.getPreRequisitos();
        if(preReqs != null){
            for(String siglaPreReq: preReqs){
                //System.out.println("Adicionando "+siglaPreReq+" a "+d.getSigla());
                adicionaPreRequisito(d.getSigla(), siglaPreReq);
            }
        }
    }

    
    /**
     * Cria uma árvore a partir da sigla de uma disciplina.
     * @param siglaRaiz 
     */
    public CadeiaTO(String siglaRaiz) {
        super(siglaRaiz);
    }
    
    /**
     * Adiciona um pré-requisito a uma disciplina utilizando apenas suas siglas.
     * @param siglaDisc Sigla da disciplina mãe.
     * @param siglaPreReq Sigla do pré-requisito.
     */
    public void adicionaPreRequisito(String siglaDisc, String siglaPreReq){
        this.add(siglaDisc, siglaPreReq);
    }
    
    /**
     * Retorna os pré-requisitos de uma disciplina
     * @param sigla Sigla da disciplina cujos pré-requisitos deseja-se obter.
     * @return Siglas dos pré-requisitos da disciplina parâmetro.
     */
    public List<String> getPreRequisitos(String sigla){
        return getNeighbors(sigla);
    }
    
    /**
     * Retorna o número de semestres necessários para completar a subArvore.
     * @return Número de semestres necessários para completar a subArvore.
     */
    public int getNSemestres(){
        return height;
    }
    
    /**
     * Retorna a sigla da disciplina raiz da cadeia.
     * @return Sigla da disciplina raiz da cadeia.
     */
    public String getSiglaRaiz(){
        return root;
    }
    
    /**
     * (Obsoleto) Retorna uma string representando a árvore.
     * @return Uma string representando a árvore em ASCII.
     */
    public String toString(){
        return PreReqString(root);
    }
    
    private String PreReqString(String sigla){
        String subArvore = sigla;
        List<String> preReqs = getPreRequisitos(sigla);
        
        if(preReqs!= null){
            subArvore += "(";
            for(String pr: preReqs){
                subArvore += PreReqString(pr);
            }
            subArvore += ")";
        }
        
        return subArvore;
    }
}
